package com.sweet.string;

import java.util.regex.Pattern;

/**
 * 验证工具
 *
 * @author limi
 * @date 2020-09-14 11:06
 */
public class Validator {
    /**
     * 邮件，符合RFC 5322规范，正则来自：http://emailregex.com/
     */
    public final static Pattern EMAIL = Pattern.compile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])");

    /**
     * 中国区手机号码
     */
    public final static Pattern MOBILE = Pattern.compile("1[3456789]\\d{9}");

    /**
     * 中国区座机
     */
    public final static Pattern TELEPHONE = Pattern.compile("([0-9]{3})+-([0-9]{4})+([0-9]{4})");

    /**
     * IP v4
     */
    public final static Pattern IPV4 = Pattern.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b");

    /**
     * 验证是否为手机号码（中国）
     * 正则1："^[1][3,4,5,8][0-9]{9}$"
     * 正则2："^(13[4,5,6,7,8,9]|15[0,8,9,1,7]|188|187)\\d{8}$"
     * 正则3："^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$"
     *
     * @param value 值
     * @return 是否为手机号码（中国）
     */
    public static boolean isMobile(String value) {
        return isMatch(MOBILE, value);
    }

    /**
     * 验证座机号码
     *
     * @param value 座机
     * @return
     */
    public static boolean isTelephone(String value) {
        return isMatch(TELEPHONE, value);
    }

    /**
     * 验证是否为可用邮箱地址
     *
     * @param value 值
     * @return 否为可用邮箱地址
     */
    public static boolean isEmail(String value) {
        return isMatch(EMAIL, value);
    }

    /**
     * 验证是否为IPV4地址
     *
     * @param value 值
     * @return 是否为IPV4地址
     */
    public static boolean isIpv4(String value) {
        return isMatch(IPV4, value);
    }

    /**
     * 给定内容是否匹配正则
     *
     * @param pattern 模式
     * @param content 内容
     * @return 正则为null或者""则不检查，返回true，内容为null返回false
     */
    private static boolean isMatch(Pattern pattern, String content) {
        // 提供null的字符串为不匹配
        return (content == null || pattern == null) ? false : pattern.matcher(content).matches();
    }
}
